package com.sisSaude.daos;

import java.sql.ResultSet;
import java.util.Vector;

import com.sisSaude.entityBeans.Funcionario;
import com.sisSaude.utils.DataProvider;
import com.sisSaude.utils.SqlFactory;

public class FuncionarioDAO extends GenericDAO<Funcionario> {

	// fields
	public static String SELECT_BASICA = " SELECT Funcionario.*," +
			                             "        Cargo.descricao AS descricaoDoCargo " +
                                         " FROM Funcionario " +
                                         " INNER JOIN Cargo ON Cargo.id = Funcionario.idCargo ";
	
	// public methods
	public boolean canDelete(Funcionario funcionario) {
		DataProvider dataProvider = new DataProvider();
		return dataProvider.canDelete("Funcionario", funcionario.getId());
	}
	public boolean delete(Funcionario funcionario) {
		String sql = SqlFactory.getSqlDelete("Funcionario", "id");
		DataProvider dataProvider = new DataProvider();
		Vector<Object> params = new Vector<Object>();
		params.add(funcionario.getId());
		try {
			dataProvider.execute(sql, params);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			dataProvider.close();
		}
		return true;
	}
	public Funcionario get(int id) {
		Funcionario funcionario = null;
		String sql = SELECT_BASICA + " WHERE Funcionario.id = ? "; 
		DataProvider dataProvider = new DataProvider();
		Vector<Object> params = new Vector<Object>();
		params.add(id);
		try {
			dataProvider.select(sql, params);
			if (dataProvider.next()) {
				funcionario = new Funcionario();
				loadAttribs(funcionario, dataProvider.getResultSet());
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			dataProvider.close();
		}
		return funcionario;
	}
	public void loadAttribs(Funcionario funcionario, ResultSet r) {
		try {
			funcionario.setId(r.getInt("id"));
			funcionario.setNome(r.getString("nome"));
			funcionario.setIdUsuario(r.getInt("idUsuario"));
			funcionario.setIdCargo(r.getInt("idCargo"));
			funcionario.setDescricaoDoCargo(r.getString("descricaoDoCargo"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// protected methods
	protected boolean insert(Funcionario funcionario) {
		String sql = SqlFactory.getSqlInsert("Funcionario");
		DataProvider dataProvider = new DataProvider();
		Vector<Object> params = new Vector<Object>();
		params.add(funcionario.getId());
	 	params.add(funcionario.getNome());
		params.add(funcionario.getIdUsuario());
	 	params.add(funcionario.getIdCargo());
		try {
			funcionario.setId(dataProvider.insert(sql, params));
			return funcionario.getId() > 0;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			dataProvider.close();
		}
	}
	protected boolean update(Funcionario funcionario) {
		String sql = SqlFactory.getSqlUpdate("Funcionario", "Funcionario.id");
		DataProvider dataProvider = new DataProvider();
		Vector<Object> params = new Vector<Object>();
		params.add(funcionario.getNome());
		params.add(funcionario.getIdUsuario());
	 	params.add(funcionario.getIdCargo());
		params.add(funcionario.getId());
		try {
			dataProvider.execute(sql, params);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			dataProvider.close();
		}
		return true;
	}

}
